#!/bin/bash
#
# Comando "MirarT"
#
# PURPOSE: Este script permite generar una visualisazión amigable del
#	   contenido del archivo de logs, por ejemplo, a través de
#	   filtros mostrar solo la información necesaria.
# OUTPUT:
# 	Mensajes del log filtrados.
#
# OPCIONES Y PARÁMETROS:
#	Parámetro 1 (obligatorio): comando.
#	Parámetro 2 (deseable): filtros posibles (-h para hora, -d para dia, -m para mes, -a para año, -t para tipo) .
#	Parámetro 3 (obligatorio si hay tipo de filtro definido): filtro.

######################################################
# Constantes
######################################################

CANT_MAX_PARAM=11
CANT_MIN_PARAM=1

######################################################
# La siguiente funcion muestra un ejemplo de ayuda en
# el caso de que hubiese habido algún error en los
# parámetros ingresados.
######################################################

function help_MirarT()
{
  echo " "
  echo "Uso: $(basename $0) <comando> <filtro> <parámetro de filtrado> <filtro> <parámetro de filtrado>..."
  echo " "
  echo " ************ Tipos de Filtro ************"
  echo "    -h    Filtrado por hora"
  echo "    -d    Filtrado por dia"
  echo "    -m    Filtrado por mes"
  echo "    -a    Filtrado por año"
  echo "    -t    Filtrado por tipo de error"
  echo "    -n    Se muestran las últimas n líneas del archivo de log"
  echo "          Este parámetro debe ir acompañado de la cantidad de líneas a mostrar."
  echo " "
  echo " *********** Parámetro de filtrado **************"
  echo "  -- Especifica el valor del filtro"
  echo " "
  echo "Ejemplo: $(basename $0) -d 20 -m 02"

}

######################################################
# Definición de variables.
######################################################

logdir=""		#contiene la dirección del directorio de logs.
archivo=""		#contiene el nombre del archivo de logs a filtrar.
cadena_leida=""		#contiene la una linea leida del archivo de logs.
param_anterior="" 	#variable para la lectura de filtros
tipo=""			#contiene el valor del filtro por tipo
hora=""			#contiene el valor del filtro por hora
dia=""			#contiene el valor del filtro por dia_Leido
mes=""			#contiene el valor del filtro por mes_Leido
anio=""			#contiene el valor del filtro por año
n_lineas=""		#contiene la cantidad de lineas
flag_tipo=0
flag_hora=0		#Flags para marcar los filtros ingresados
flag_dia=0
flag_mes=0
flag_anio=0
flag_n_lineas=0

######################################################
# Verifico que las variables de entorno necesarias
# esten definidas.
######################################################

if [ -z "$GRUPO" ] || [ -z "$LOGDIR" ]
then
  echo "Error: Variables de entorno no definidas"
  exit 1
fi

######################################################
# Chequeo del número de parámetros.
######################################################

if [ $# -gt $CANT_MAX_PARAM -o $# -lt $CANT_MIN_PARAM ]
then
	help_MirarT
	exit 1
fi

######################################################
# Defino el directorio donde se encuentran los archivos
# de logs.
######################################################

if [ "$1" == "InstalarT" ]
then
	logdir="$CONFDIR"
else
	logdir="$LOGDIR"
fi

archivo=$logdir/$1.log

######################################################
# Se verifica que el archivo de log exista.
######################################################

if [ ! -f $archivo ]
then
  	echo "No existe el archivo de log."
  	exit 1
fi

######################################################
# Cargo los filtros con los datos ingresados por el
# usuario.
######################################################

for (( i=2; i<=$#; i++ )); do
  eval arg=\$$i
  let operacion="$i % 2"
  if [ $operacion == 0 ]
  then
   case $arg in
    "-t") if [ $flag_tipo != 1 ]
	  then
	      flag_tipo=1
	      i=`expr $i + 1`
	      eval arg=\$$i
	      tipo=$(echo $arg | tr "[:lower:]" "[:upper:]") 
	  else
	      echo "Cada parámetro de búsqueda debe ser especificado una única vez."
	      exit 1
	  fi
	  ;;
    "-h") if [ $flag_hora != 1 ]
	  then
	      flag_hora=1
	      i=`expr $i + 1`
	      eval arg=\$$i
	      hora=$arg	      
	  else
	      echo "Cada parámetro de búsqueda debe ser especificado una única vez."
	      exit 1
	  fi
	  ;;
    "-d") if [ $flag_dia != 1 ]
	  then
   	      flag_dia=1
	      i=`expr $i + 1`
	      eval arg=\$$i
	      dia=$arg 
	  else
	      echo "Cada parámetro de búsqueda debe ser especificado una única vez."
	      exit 1
	  fi
	  ;;
    "-m") if [ $flag_mes != 1 ]
	  then
	      flag_mes=1
	      i=`expr $i + 1`
	      eval arg=\$$i
	      mes=$arg 
	  else
	      echo "Cada parámetro de búsqueda debe ser especificado una única vez."
	      exit 1
	  fi
	  ;;
    "-a") if [ $flag_anio != 1 ]
	  then
	      flag_anio=1
	      i=`expr $i + 1`
	      eval arg=\$$i
	      anio=$arg
	  else
	      echo "Cada parámetro de búsqueda debe ser especificado una única vez."
	      exit 1
	  fi
	  ;;
    "-n") if [ $flag_n_lineas != 1 ]
	  then
	      flag_n_lineas=1
	      i=`expr $i + 1`
	      eval arg=\$$i
	      n_lineas=$arg
	  else
	      echo "Cada parámetro de búsqueda debe ser especificado una única vez."
	      exit 1
	  fi
	  ;;
    *)
	  echo "Parámetro de búsqueda incorrecto"
	  exit 1
	  ;;
    esac
  fi
done

######################################################
# Verifico que el parámetro -n no esté acompañado por
# otro parámetro de búsqueda.
######################################################

if [ $flag_n_lineas == 1 ] && ( [ $flag_anio == 1 ] || [ $flag_dia == 1 ] || [ $flag_hora == 1 ] || [ $flag_mes == 1 ] || [ $flag_tipo == 1 ] )
then
  echo "El parámetro -n debe ser invocado individualmente."
  exit 1
fi

######################################################
# Verifico que el valor del parámetro -n sea un número
# entero positivo o no esté vacío.
######################################################

if [ ! -z "$( echo $n_lineas | sed s/[0-9]//g )" ]
then
  echo "Error, la cantidad de líneas debe ser un número entero positivo."
  exit 1
fi

if [ $flag_n_lineas == 1 ] 
then
  if [ ! -z $n_lineas ]
   then
      tail -n $n_lineas $archivo
      exit 0
  else
     echo "Error, debe especificar la cantidad de líneas que desea mostrar."
     exit 1
  fi
fi

######################################################
# Verifico que los filtros seleccionados contengan valores.
######################################################

if ( [ -z $tipo ] && [ $flag_tipo = 1 ] ) || ( [ -z $hora ] && [ $flag_hora = 1 ] ) || ( [ -z $dia ] && [ $flag_dia = 1 ] ) || ( [ -z $mes ] && [ $flag_mes = 1 ] ) || ( [ -z $anio ] && [ $flag_anio = 1 ] )
then    
  echo "Error, los filtros seleccionados deben contener valores."
  exit 1
fi

######################################################
# Procesamiento de las lineas del archivo de logs con
# el filtro definido.
######################################################

while read linea
do 
  fecha_Leida=$(echo "$linea" | cut -d " " -f 1)
  hora_Leida=$(echo "$linea" | cut -d " " -f 2)
  hora_Leida=$(echo "$hora_Leida" | cut -d "-" -f 1)
  hora_Leida=$(echo "$hora_Leida" | cut -d ":" -f 1)
  usuario_Leido=$(echo "$linea" | cut -d "-" -f 2)
  comando_Leido=$(echo "$linea" | cut -d "-" -f 3)
  tipo_error_Leido=$(echo "$linea" | cut -d "-" -f 4)
  mensaje_Leido=$(echo "$linea" | cut -d "-" -f 5)
  dia_Leido=$(echo "$fecha_Leida" | cut -d "/" -f 1)
  mes_Leido=$(echo "$fecha_Leida" | cut -d "/" -f 2)
  anio_Leido=$(echo "$fecha_Leida" | cut -d "/" -f 3)
  if [ -z $tipo ] || [ $flag_tipo = 0 ]
  then
        tipo=$tipo_error_Leido
  fi
  if [ -z $hora ] || [ $flag_hora = 0 ]
  then
        hora=$hora_Leida
  fi

  if [ -z $dia ] || [ $flag_dia = 0 ]
  then
        dia=$dia_Leido
  fi
  if [ -z $mes ] || [ $flag_mes = 0 ]
  then
        mes=$mes_Leido
  fi
  if [ -z $anio ] || [ $flag_anio = 0 ]
  then
        anio=$anio_Leido
  fi
  if [ $tipo = $tipo_error_Leido ] && [ $hora = $hora_Leida ] && [ $dia = $dia_Leido ] && [ $mes = $mes_Leido ] && [ $anio = $anio_Leido ]
  then
    echo "$linea"
  fi
done < $archivo

exit 1
